package ar.edu.utn.frba.dds.aterrizar;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineaLanchitaAdapter;
import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineaOceanicAdapter;
import ar.edu.utn.frba.dds.aterrizar.aerolineas.AerolineasInterface;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Busqueda;
import ar.edu.utn.frba.dds.aterrizar.busquedas.CondicionesExtra;
import ar.edu.utn.frba.dds.aterrizar.busquedas.CondicionesExtraBuilder;
import ar.edu.utn.frba.dds.aterrizar.busquedas.RangoFechas;
import ar.edu.utn.frba.dds.aterrizar.busquedas.Vuelo;
import ar.edu.utn.frba.dds.aterrizar.domain.fechas.ConversorDeFormato;
import ar.edu.utn.frba.dds.aterrizar.mocks.MockAerolineaLanchitaOriginal;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Estandar;
import ar.edu.utn.frba.dds.aterrizar.usuarios.NoPaga;
import ar.edu.utn.frba.dds.aterrizar.usuarios.Usuario;
import ar.edu.utn.frba.dds.aterrizar.usuarios.VIP;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;

import org.junit.Before;
import org.junit.Test;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.CodigoErroneoException;

public class testReservas 
{
	CondicionesExtraBuilder condicionesExtraBuilderEmptyBuilder = new CondicionesExtraBuilder();
	CondicionesExtra condicionesExtraEmpty = condicionesExtraBuilderEmptyBuilder.build();
	Busqueda sinRestriccion = new Busqueda(null, null, new RangoFechas("20121010", null, null, null), condicionesExtraEmpty);
	
	
	Usuario usuarioEstandar = new Usuario("Pepa", new Estandar(), "Pipa", "67534650");
	Usuario usuarioEstandar2 = new Usuario("Pepa2", new Estandar(), "Pipa2", "38576940");
	Usuario usuarioVIP = new Usuario("juan", new VIP(), "pablo", "08679642");
	Usuario usuarioNoPaga = new Usuario("franco", new NoPaga(), "tano", "43658048");
	
	AerolineasInterface aerolinea;
	
	ArrayList<Vuelo> lstAsientos = new ArrayList<Vuelo>();
	
	Vuelo oAsientoEjemplo;
	@Before
	public void setUp() 
	{
		aerolinea = new AerolineaLanchitaAdapter(new MockAerolineaLanchitaOriginal());// aca ponemos la aerolinea que vamos a usar como unos campeones
		lstAsientos = aerolinea.getAsientosTotales();
		
		oAsientoEjemplo = new Vuelo();
		if(aerolinea.quienSoy() == "Lanchita")
		{
			oAsientoEjemplo.setCodigoDeAsiento("01202022227897-3");
			oAsientoEjemplo = aerolinea.encontrarVueloPorCodigo(oAsientoEjemplo);
		}
		else if(aerolinea.quienSoy() == "Oceanic")
		{
			oAsientoEjemplo.setCodigoDeAsiento("OC100");
			oAsientoEjemplo.setCodigoDeVuelo("10");
			oAsientoEjemplo = aerolinea.encontrarVueloPorCodigo(oAsientoEjemplo);
		}
		
	}

	@SuppressWarnings("La fecha de expiracion de la reserva esta hardcodeado")
	@Test
	public void reservarVueloUsuarioEstandarGenerandoSobreReserva() throws ErrorEnLogicaDeAsientosException 
	{
		Reserva oReserva = new Reserva();
		oReserva.Reservar(aerolinea, oAsientoEjemplo, usuarioEstandar2, new Date(2012,8,20));
		oReserva.Reservar(aerolinea, oAsientoEjemplo, usuarioEstandar, new Date(2012,8,21));
		assertEquals(oAsientoEjemplo.getLstsobrerecarga().get(oAsientoEjemplo.getLstsobrerecarga().size()).usuario, usuarioEstandar);
	}
	
	@SuppressWarnings("La fecha de expiracion de la reserva esta hardcodeado")
	@Test
	public void reservarUsuarioNoEstandarAsientoReservado() throws ErrorEnLogicaDeAsientosException 
	{
		Reserva oReserva = new Reserva();
		SobreRecarga sr;
		oReserva.Reservar(aerolinea, oAsientoEjemplo, usuarioEstandar, new Date(2012,8,19)); // hago una reserva antes
		sr = oAsientoEjemplo.getLstsobrerecarga().get(oAsientoEjemplo.getLstsobrerecarga().size() - 1); //guardo ultima sobre-reserva			
		oReserva.Reservar(aerolinea, oAsientoEjemplo, usuarioVIP, new Date(2012,8,20));
		assertEquals(oAsientoEjemplo.getLstsobrerecarga().get(oAsientoEjemplo.getLstsobrerecarga().size()), sr);			
		
	}
	@Test
	public void reservarUsuarioEstandarAsientoReservadoSinSobreReserva() throws ErrorEnLogicaDeAsientosException 
	{
		Reserva oReserva = new Reserva();
		assertEquals(oAsientoEjemplo.getEstado(), "D");
		oReserva.Reservar(aerolinea, oAsientoEjemplo, usuarioEstandar, new Date(2012,8,20));
		assertEquals(oAsientoEjemplo.getLstsobrerecarga().get(0).usuario, usuarioVIP); 
	}
	@Test
	public void comprarAsiento() 
	{
		assertEquals(oAsientoEjemplo.getEstado(), "D");
		aerolinea.comprarVuelo(oAsientoEjemplo, usuarioEstandar);
		assertEquals(oAsientoEjemplo.getEstado(), "C");
	}
}
